;BARRY ZARUCKI M0DGQ ;TWO INDEPENDENT 230VAC TOGGLE SWITCHES CONTROLLED FROM TWO MOMENTARY PUSH BUTTONS ;PIC10F322 ;INTERRUPT ON CHANGE ROUTINE USED ;TWO PUSH BUTTONS, TWO OUTPUTS ;******************************************************************************************************************** LIST P=PIC10F322 ;tell assembler what chip we are using INCLUDE "P10F322.inc" ;include the defaults for the chip __CONFIG 0x3880 ;CONFIGURATION WORD ;INT OSC 4MHZ, BOREN OFF, WDT OFF, PWRT ON, MCLRE DIGITAL INPUT, CP OFF, LVP OFF, BOR OF, WRT OFF. ;************************************************************************************************************** CBLOCK 0x40 ;SEQUENCIAL ALLOCATING OF GP REGISTERS STARTING AT 0x040 (NOTE START ADDRESS, PIC16F628 STARTS AT 0x20) DLY_COUNT1 ;USED FOR DELAY ROUTINE DLY_COUNT2 OPTO ENDC ;**************************************************************************************** #DEFINE OP1 PORTA,0 ;MAINS OPTO 1 #DEFINE OP2 PORTA,1 ;MAINS OPTO 2 #DEFINE BUTT_2 PORTA,2 ;PUSH BUTTON 2 #DEFINE BUTT_3 PORTA,3 ;PUSH BUTTON 3 ;******************************************************************************************* ORG 0x0000 ;org sets the origin, 0x0000 for the PIC10F322 GOTO START ;******************************************************************************************** ORG 0x0004 ;INTERRUPT VECTOR GOTO ISR ;******************************************************************************************* ;SET OSC, PORTS ETC. START MOVLW b'01010000' MOVWF OSCCON ;SET INT OSC TO 4 MHz CLRF ANSELA ;SET ALL PORTS TO DIGITAL I/O CLRF PORTA ;CLEAR PORTA CLRF OPTO MOVLW b'11111100' MOVWF TRISA ;PORTA,0 AND 1 IS OUTPUT, REST INPUTS BSF IOCAP,2 ;ENABLE IOC POSITIVE EDGE ON RA2,TRIGERS ON RISING EDGE OF BUTTON PRESS BSF IOCAP,3 ;ENABLE IOC POSITIVE EDGE ON RA3,TRIGERS ON RISING EDGE OF BUTTON PRESS BSF INTCON,IOCIE ;INTCON REG INTERRUPT ON CHANGE ENABLE BSF INTCON,GIE ;GLOBAL INTERRUPT ENABLE MAIN ;OPTO REGISTER IS USED AS A STATUS REGISTER FOR OP1 AND OP2 ( OUTPUTS FOR BOTH SWITCHES ), DEPENDING ON THE STATUS OF OPTO,0 AND OPTO,1 OP1 AND OP2 ARE SWITCHED ACCORDINGLY. BTFSC OPTO,0 ;CHECK STATUS OF OPTO REG BIT 0 GOTO $+3 ;BIT SET SO BRANCH AROUND NEXT THREE INSTRUCTIONS BCF OP1 ;TURN OFF OUTPUT 1 GOTO $+2 ;BRANCH AROUND NEXT TWO INSTRUCTIONS BSF OP1 ;TURN ON OUTPUT 1 BTFSC OPTO,1 ;CHECK STATUS OF OPTO REG BIT 1 GOTO $+3 BCF OP2 ;TURN OFF OUTPUT 2 GOTO $+2 BSF OP2 ;TURN ON OUTPUT 2 GOTO MAIN ;LOOP ;***************************************************************************************** ISR ;THIS ROUTINE DETECTS INTERRUPT ON CHANGE PORTA BITS 2 AND 3 ;SWITCH BOUNCE ROUTINE ;XOR USED TO TOGGLE SWITCH OUTPUT BCF INTCON,GIE ;CLEAR GLOBAL INTERRUPT ENABLE,NO MORE INTERRUPTS BTFSS IOCAF,2 ;TEST INTERRUPT ON CHANGE FLAG IOCAF,2 GOTO NEXT_BUTT ;BUTT_2 NOT PRESSED SO MUST BE BUTT_3 BTFSS BUTT_2 ;CHECK IF BUTTON 2 PRESSED GOTO RTN ;NO, INVALID PRESS SO BRANCH AROUND CALL DELAY ;WAIT FOR SWITCH BOUNCE BTFSS BUTT_2 ;VALID PRESS SKIP NEXT INSTRUCTION GOTO RTN ;INVALID PRESS, GO TO RETURN BTFSC BUTT_2 ;HAS BUTTON BEEN RELEASED? GOTO $-1 ;NO CALL DELAY ;YES, WAIT FOR SWITCH BOUNCE BTFSC BUTT_2 ;BOUNCE OVER? GOTO $-4 ;NO MOVLW .1 ;MOVE 1 INTO W REG (00000001) XORWF OPTO,F ;XOR W REG WITH OPTO , LEAVE RESULT IN OPTO GOTO RTN ;BRANCH NEXT_BUTT BTFSS BUTT_3 ;CHECK IF BUTTON 3 PRESSED GOTO RTN ;NO,INVALID PRESS SO BRANCH AROUND CALL DELAY ;WAIT FOR SWITCH BOUNCE BTFSS BUTT_3 ;VALID PRESS SKIP NEXT INSTRUCTION GOTO RTN ;INVALID PRESS, GO TO RETURN BTFSC BUTT_3 ;HAS BUTTON BEEN RELEASED? GOTO $-1 ;NO CALL DELAY ;YES, WAIT FOR SWITCH BOUNCE BTFSC BUTT_3 ;BOUNCE OVER? GOTO $-4 ;NO MOVLW .2 ;MOVE 2 INTO W REG (00000010) XORWF OPTO,F ;XOR W REG WITH OPTO , LEAVE RESULT IN OPTO RTN BCF IOCAF,3 ;CLEAR INTERRUPT ON CHANGE FLAG 3, THIS ALSO CLEARS IOCIF FLAG IN INTCON REGISTER BCF IOCAF,2 ;CLEAR INTERRUPT ON CHANGE FLAG 2, THIS ALSO CLEARS IOCIF FLAG IN INTCON REGISTER BCF INTCON,INTF ;CLEAR INTERRUPT FLAG IN INTCON BSF INTCON,GIE ;ENABLE GLOBAL INTERRUPT RETURN ;************************************************************************************************* DELAY ;55mS DELAY FOR SWITCH BOUNCE, THIS SHOULD BE LONG ENOUGH FOR POOR QUALITY SWITCHES MOVLW .100 MOVWF DLY_COUNT1 MOVLW .72 MOVWF DLY_COUNT2 LOOP DECFSZ DLY_COUNT1,1 GOTO LOOP DECFSZ DLY_COUNT2,1 GOTO LOOP RETURN ;************************************************************************************************ END